home *** CD-ROM | disk | FTP | other *** search
- /**
- * Scout - The Amiga System Monitor
- *
- *------------------------------------------------------------------
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * You must not use this source code to gain profit of any kind!
- *
- *------------------------------------------------------------------
- *
- * @author Andreas Gelhausen
- * @author Richard Körber <rkoerber@gmx.de>
- */
-
- #include "system_headers.h"
-
- struct AssignsCallbackUserData {
- APTR ud_Tree;
- ULONG ud_Count;
- };
-
- static __asm __saveds LONG asstree_confunc(register __a2 Object *obj, register __a1 struct MUIP_NListtree_ConstructMessage *msg, register __a0 struct Hook *hook)
- {
- return AllocListEntry(msg->MemPool, msg->UserData, sizeof(struct AssignEntry));
- }
-
- MakeHook(asstree_conhook, asstree_confunc);
-
- static __asm __saveds LONG asstree_desfunc(register __a2 Object *obj, register __a1 struct MUIP_NListtree_ConstructMessage *msg, register __a0 struct Hook *hook)
- {
- FreeListEntry(msg->MemPool, &msg->UserData);
-
- return 0;
- }
-
- MakeHook(asstree_deshook, asstree_desfunc);
-
- static __asm __saveds LONG asstree_dspfunc(register __a2 Object *obj, register __a1 struct MUIP_NListtree_DisplayMessage *msg, register __a0 struct Hook *hook)
- {
- static UBYTE *empty = "\0";
-
- if (msg->TreeNode != NULL) {
- struct AssignEntry *ae = msg->TreeNode->tn_User;
-
- if (stricmp(ae->ae_Type, "ADD_NODE") == 0) {
- msg->Array[0] = ae->ae_Address;
- msg->Array[1] = empty;
- msg->Array[2] = ae->ae_Path;
- } else {
- msg->Array[0] = ae->ae_Address;
- msg->Array[1] = ae->ae_Name;
- msg->Array[2] = ae->ae_Path;
- }
- } else {
- msg->Array[0] = "Address";
- msg->Array[1] = "Name";
- msg->Array[2] = "Path";
- msg->Preparse[0] = MUIX_B;
- msg->Preparse[1] = MUIX_B;
- msg->Preparse[2] = MUIX_B;
- }
-
- return 0;
- }
-
- MakeHook(asstree_dsphook, asstree_dspfunc);
-
- static __asm __saveds LONG asstree_cmpfunc(register __a2 Object *obj, register __a1 struct MUIP_NListtree_CompareMessage *msg, register __a0 struct Hook *hook)
- {
- LONG cmp;
- struct AssignEntry *ae1, *ae2;
-
- ae1 = (struct AssignEntry *)msg->TreeNode1->tn_User;
- ae2 = (struct AssignEntry *)msg->TreeNode2->tn_User;
-
- cmp = stricmp(ae1->ae_Name, ae2->ae_Name);
- if (cmp == 0) cmp = stricmp(ae1->ae_RealPath, ae2->ae_RealPath);
-
- return cmp;
- }
-
- MakeHook(asstree_cmphook, asstree_cmpfunc);
-
- static __asm __saveds LONG asstree_findfunc(register __a2 Object *obj, register __a1 struct MUIP_NListtree_FindUserDataMessage *msg, register __a0 struct Hook *hook)
- {
- struct AssignEntry *ae;
-
- ae = (struct AssignEntry *)msg->UserData;
-
- if (ae) {
- return stricmp((UBYTE *)msg->User, ae->ae_Name);
- } else {
- return ~0;
- }
- }
-
- MakeHook(asstree_findhook, asstree_findfunc);
-
- static void ReceiveList( void (* callback)( struct AssignEntry *ae, void *userData ),
- void *userData )
- {
- struct AssignEntry *ae;
-
- if (ae = tbAllocVecPooled(globalPool, sizeof(struct AssignEntry))) {
- if (SendDaemon("GetAssList")) {
- while (ReceiveDecodedEntry((UBYTE *)ae, sizeof(struct AssignEntry))) {
- callback(ae, userData);
- }
- }
-
- tbFreeVecPooled(globalPool, ae);
- }
- }
-
- static void IterateList( void (* callback)( struct AssignEntry *ae, void *userData ),
- void *userData )
- {
- struct FileInfoBlock *fib;
-
- if (fib = AllocDosObject(DOS_FIB, TAG_DONE)) {
- UBYTE *tmp;
- struct AssignEntry *ae;
-
- tmp = tbAllocVecPooled(globalPool, PATH_LENGTH);
- ae = tbAllocVecPooled(globalPool, sizeof(struct AssignEntry));
-
- if (tmp != NULL && ae != NULL) {
- struct DosList *dol;
-
- dol = LockDosList(LDF_READ | LDF_ASSIGNS);
-
- while (dol = NextDosEntry(dol, LDF_ASSIGNS)) {
- struct AssignList *list;
-
- ae->ae_Addr = dol;
- _snprintf(ae->ae_Address, sizeof(ae->ae_Address), "$%08lx", dol);
- b2cstrn(dol->dol_Name, ae->ae_Name, sizeof(ae->ae_Name));
-
- if (dol->dol_Lock != (BPTR)NULL && Examine(dol->dol_Lock, fib)) {
- NameFromLock(dol->dol_Lock, tmp, PATH_LENGTH);
-
- stccpy(ae->ae_Path, tmp, sizeof(ae->ae_Path));
- stccpy(ae->ae_RealPath, tmp, sizeof(ae->ae_RealPath));
- stccpy(ae->ae_Type, "NORMAL", sizeof(ae->ae_Type));
- } else {
- switch (dol->dol_Type) {
- case DLT_LATE:
- _snprintf(ae->ae_Path, sizeof(ae->ae_Path), "<%s>", dol->dol_misc.dol_assign.dol_AssignName);
- stccpy(ae->ae_RealPath, dol->dol_misc.dol_assign.dol_AssignName, sizeof(ae->ae_RealPath));
- stccpy(ae->ae_Type, "LATE", sizeof(ae->ae_Type));
- break;
-
- case DLT_NONBINDING:
- _snprintf(ae->ae_Path, sizeof(ae->ae_Path), "[%s]", dol->dol_misc.dol_assign.dol_AssignName);
- stccpy(ae->ae_RealPath, dol->dol_misc.dol_assign.dol_AssignName, sizeof(ae->ae_RealPath));
- stccpy(ae->ae_Type, "PATH", sizeof(ae->ae_Type));
- break;
-
- default:
- ae->ae_Path[0] = 0x00;
- ae->ae_RealPath[0] = 0x00;
- stccpy(ae->ae_Type, "NORMAL", sizeof(ae->ae_Type));
- break;
- }
- }
-
-
- if (list = dol->dol_misc.dol_assign.dol_List) {
- stccpy(ae->ae_Type, "ADD_LIST", sizeof(ae->ae_Type));
- callback(ae, userData);
-
- do {
- ae->ae_Addr = (APTR)list->al_Lock;
- _snprintf(ae->ae_Address, sizeof(ae->ae_Address), "$%08lx", BADDR(list->al_Lock));
- b2cstrn(dol->dol_Name, ae->ae_Name, sizeof(ae->ae_Name));
-
- if (list->al_Lock != (BPTR)NULL && Examine(list->al_Lock, fib)) {
- NameFromLock(list->al_Lock, tmp, PATH_LENGTH);
-
- if (dol->dol_Type == DLT_DIRECTORY) {
- stccpy(ae->ae_Path, tmp, sizeof(ae->ae_RealPath));
- stccpy(ae->ae_RealPath, tmp, sizeof(ae->ae_RealPath));
- }
- } else {
- ae->ae_Path[0] = 0x00;
- ae->ae_RealPath[0] = 0x00;
- }
-
- stccpy(ae->ae_Type, "ADD_NODE", sizeof(ae->ae_Type));
-
- callback(ae, userData);
-
- list = (struct AssignList *)list->al_Next;
- } while (list);
- } else {
- callback(ae, userData);
- }
- }
-
- UnLockDosList(LDF_READ | LDF_ASSIGNS);
- }
-
- if (tmp) tbFreeVecPooled(globalPool, tmp);
- if (ae) tbFreeVecPooled(globalPool, ae);
-
- FreeDosObject(DOS_FIB, fib);
- }
- }
-
- static void UpdateCallback( struct AssignEntry *ae,
- void *userData )
- {
- struct AssignsCallbackUserData *ud = (struct AssignsCallbackUserData *)userData;
- struct MUI_NListtree_TreeNode *parent;
- ULONG flags;
-
- flags = 0;
- if (stricmp(ae->ae_Type, "ADD_LIST") == 0) flags = TNF_LIST | TNF_OPEN;
-
- parent = (struct MUI_NListtree_TreeNode *)DoMethod(ud->ud_Tree, MUIM_NListtree_FindUserData, MUIV_NListtree_FindUserData_ListNode_Root, ae->ae_Name, MUIV_NListtree_FindUserData_Flag_StartNode);
- DoMethod(ud->ud_Tree, MUIM_NListtree_Insert, ae->ae_Name, ae, parent, MUIV_NListtree_Insert_PrevNode_Sorted, flags);
- ud->ud_Count++;
- }
-
- static void PrintCallback( struct AssignEntry *ae,
- void *userData )
- {
- PrintFOneLine((BPTR)userData, " %9s %-16s %s\n", ae->ae_Address, ae->ae_Name, ae->ae_Path);
- }
-
- static void SendCallback( struct AssignEntry *ae,
- void *userData )
- {
- SendEncodedEntry((UBYTE *)ae, sizeof(struct AssignEntry));
- }
-
- static ULONG __saveds mNew( struct IClass *cl,
- Object *obj,
- struct opSet *msg )
- {
- APTR asslist, asstree, asstext, asscount, updateButton, printButton, removeButton, exitButton;
-
- if (obj = (Object *)DoSuperNew(cl, obj,
- MUIA_HelpNode, AssignsText,
- MUIA_Window_ID, MakeID('A','S','S','I'),
- WindowContents, VGroup,
-
- Child, asslist = MyNListtreeObject(&asstree, "BAR,BAR,BAR", &asstree_conhook, &asstree_deshook, &asstree_dsphook, &asstree_cmphook, &asstree_findhook, 2),
- Child, MyBelowListview(&asstext, &asscount),
-
- Child, MyVSpace(4),
-
- Child, HGroup, MUIA_Group_SameSize, TRUE,
- Child, updateButton = MakeButton(txtUpdate),
- Child, printButton = MakeButton(txtPrint),
- Child, removeButton = MakeButton(txtRemove),
- Child, exitButton = MakeButton(txtExit),
- End,
- End,
- TAG_MORE, msg->ops_AttrList))
- {
- struct AssignsWinData *awd = INST_DATA(cl, obj);
- APTR parent;
-
- awd->awd_AssignTree = asstree;
- awd->awd_AssignText = asstext;
- awd->awd_AssignCount = asscount;
- awd->awd_RemoveButton = removeButton;
-
- parent = (APTR)GetTagData(MUIA_Window_ParentWindow, (ULONG)NULL, msg->ops_AttrList);
-
- set(obj, MUIA_Window_Title, MyGetWindowTitle("ASSIGNS", awd->awd_Title, sizeof(awd->awd_Title)));
- set(obj, MUIA_Window_ActiveObject, asslist);
- set(removeButton, MUIA_Disabled, TRUE);
-
- DoMethod(parent, MUIM_Window_AddChildWindow, obj);
- DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, MUIV_Notify_Application, 5, MUIM_Application_PushMethod, parent, 2, MUIM_Window_RemChildWindow, obj);
- DoMethod(asstree, MUIM_Notify, MUIA_NListtree_Active, MUIV_EveryTime, obj, 1, MUIM_AssignsWin_ListChange);
- DoMethod(updateButton, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_AssignsWin_Update);
- DoMethod(printButton, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_AssignsWin_Print);
- DoMethod(removeButton, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_AssignsWin_Remove);
- DoMethod(exitButton, MUIM_Notify, MUIA_Pressed, FALSE, obj, 3, MUIM_Set, MUIA_Window_CloseRequest, TRUE);
- }
-
- return (ULONG)obj;
- }
-
- static ULONG __saveds mDispose( struct IClass *cl,
- Object *obj,
- struct opSet *msg )
- {
- struct AssignsWinData *awd = INST_DATA(cl, obj);
-
- set(obj, MUIA_Window_Open, FALSE);
- DoMethod(awd->awd_AssignTree, MUIM_NListtree_Clear, NULL, 0);
-
- return (DoSuperMethodA(cl, obj, msg));
- }
-
- static ULONG __saveds mUpdate( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- struct AssignsWinData *awd = INST_DATA(cl, obj);
- struct AssignsCallbackUserData ud;
-
- ApplicationSleep(TRUE);
- set(awd->awd_AssignTree, MUIA_NListtree_Quiet, TRUE);
- DoMethod(awd->awd_AssignTree, MUIM_NListtree_Clear, NULL, 0);
-
- ud.ud_Tree = awd->awd_AssignTree;
- ud.ud_Count = 0;
-
- if (clientstate) {
- ReceiveList(UpdateCallback, &ud);
- } else {
- IterateList(UpdateCallback, &ud);
- }
-
- SetCountText(awd->awd_AssignCount, ud.ud_Count);
- MySetContents(awd->awd_AssignText, "");
-
- set(awd->awd_AssignTree, MUIA_NListtree_Quiet, FALSE);
- set(awd->awd_RemoveButton, MUIA_Disabled, TRUE);
- ApplicationSleep(FALSE);
-
- return 0;
- }
-
- static ULONG __saveds mPrint( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- PrintAssigns(NULL);
-
- return 0;
- }
-
- static ULONG __saveds mRemove( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- struct AssignsWinData *awd = INST_DATA(cl, obj);
- struct MUI_NListtree_TreeNode *tn;
-
- if (tn = GetActiveTreeNode(awd->awd_AssignTree)) {
- struct AssignEntry *ae = (struct AssignEntry *)tn->tn_User;
-
- if (stricmp(ae->ae_Type, "ASSIGN_ADD") == 0) {
- if (MyRequest(msgYesNo, msgWantToRemoveAssignFromList, ae->ae_Path, ae->ae_Name)) {
- MyDoCommand("RemoveAssignList %s $%08lx", ae->ae_Name, ae->ae_Addr);
- DoMethod(obj, MUIM_AssignsWin_Update);
- }
- } else {
- if (MyRequest(msgYesNo, msgWantToRemoveAssign, ae->ae_Name)) {
- MyDoCommand("RemoveAssign %s", ae->ae_Name);
- DoMethod(obj, MUIM_AssignsWin_Update);
- }
- }
- }
-
- return 0;
- }
-
- static ULONG __saveds mListChange( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- struct AssignsWinData *awd = INST_DATA(cl, obj);
- struct MUI_NListtree_TreeNode *tn;
-
- if (tn = GetActiveTreeNode(awd->awd_AssignTree)) {
- struct AssignEntry *ae = (struct AssignEntry *)tn->tn_User;
-
- MySetContents(awd->awd_AssignText, "%s \"%s\"", ae->ae_Address, ae->ae_Name);
- set(awd->awd_RemoveButton, MUIA_Disabled, FALSE);
- }
-
- return 0;
- }
-
- ULONG __asm __saveds AssignsWinDispatcher( register __a0 struct IClass *cl,
- register __a2 Object *obj,
- register __a1 Msg msg )
- {
- switch (msg->MethodID) {
- case OM_NEW: return (mNew(cl, obj, (APTR)msg));
- case OM_DISPOSE: return (mDispose(cl, obj, (APTR)msg));
- case MUIM_AssignsWin_Update: return (mUpdate(cl, obj, (APTR)msg));
- case MUIM_AssignsWin_Print: return (mPrint(cl, obj, (APTR)msg));
- case MUIM_AssignsWin_Remove: return (mRemove(cl, obj, (APTR)msg));
- case MUIM_AssignsWin_ListChange: return (mListChange(cl, obj, (APTR)msg));
- }
-
- return (DoSuperMethodA(cl, obj, msg));
- }
-
- void PrintAssigns( char *filename )
- {
- BPTR handle;
-
- if (handle = HandlePrintStart(filename)) {
- PrintFOneLine(handle, "\n Address Name Path\n\n");
- IterateList(PrintCallback, (void *)handle);
- }
-
- HandlePrintStop();
- }
-
- void SendAssList( void )
- {
- IterateList(SendCallback, NULL);
- }
-
-